<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Menu extends CI_Controller {

	/* Layout utilizado pela pagina. */
	public $layout = 'default_admin';
	
	/* Titulo da Pagina. */
	public $title = CLIENTE;
	
	/* Menu do sistema*/
	public $menuTopo = '';
	
	/* Menu do sistema*/
	public $menuLateral = '';
	
	/* Caminho do pão do sistema */
	public $caminhoPao = '';
	
	/* css utilizado pela pagina. */
	public $css = array('admin/bootstrap', 'admin/animate', 'admin/style', 'plugins/waitMe/waitMe' );
	
	/* Js utilizado pela pagina. */
	public $js = array('plugins/jquery/jquery-2.1.4', 'admin/bootstrap', 'plugins/metisMenu/jquery.metisMenu', 'plugins/slimscroll/jquery.slimscroll.min', 'admin/principal', 'plugins/pace/pace.min', 'plugins/jquery-cookie/jquery.cookie', 'plugins/waitMe/waitMe');
	
	private $classe;
	
	public function __construct()
	{
		parent::__construct();
		//Verifica se o usuário está logado
		usuarioLogado($this->session->userdata('logged'));
		
		$this->load->model('Menu_Model', 'menu');
		$this->load->model('Vinculo_Perfil_Menu_Model', 'vinculo');
		$this->load->model('Vpm_Funcionalidade_Model', 'vpm');
		$this->load->model('Funcionalidade_Model', 'fun');
		
		$this->classe = trim(strtolower(get_class($this)));	
		
		//Valida permissões do usuário
		$this->permissao_lib->validaUsuarioPermissaoAcessarModulo($this->classe);
		
		//Montando menu dinâmico
		$this->load->library('Menu_Lib', 'menu_lib');
		$this->menuTopo = $this->menu_lib->menuTopo();
		$this->menuLateral = $this->menu_lib->menuLateral($this->classe);
	}
	
	public function index()	{					
		try {
			
				//Limpando id da sessão
				$this->session->unset_userdata('idBancoTela');
				$this->caminhoPao = $this->menu_lib->caminhoPao($this->classe, null, null);
				
				array_push($this->js, 'plugins/iCheck/icheck', 'plugins/dataTables/jquery.dataTables', 'plugins/dataTables/dataTables.bootstrap', 'plugins/dataTables/dataTables.responsive', 'admin/menu/pesquisar_menu');
				array_push($this->css, 'plugins/iCheck/custom', 'plugins/dataTables/dataTables.bootstrap', 'plugins/dataTables/dataTables.responsive');
				
				$data = null;
				$data['tipoPerfil'] = decrypt(trim($this->session->userdata('tipoPerfil')));
				
				$this->load->view('admin/menu/pesquisar_menu', $data);
			
		}catch (Exception $e){
			echo ($e->getMessage());
		}
		
	}
	
	public function pesquisar(){
		try {
			
			$this->layout = "";
			
			//Limpando id da sessão
			$this->session->unset_userdata('idBancoTela');
			
			$retornoJson = false;
			$tipoMensagem = "";
			$mensagem = "";
			
			$html = "";
			
			$descricao = trim($this->input->post('descricao'));
			
			$restrito = trim($this->input->post('restrito'));
			$restrito = empty($restrito) ? "N" : $restrito;
			
			$tipoPerfil = decrypt(trim($this->session->userdata('tipoPerfil')));
				
			$retorno = $this->menu->pesquisar($descricao, $restrito, $tipoPerfil);
			
			if (!empty($retorno)){
			
				$html .= '	<table class="table table-bordered table-striped table-hover table-heading table-datatable" id="tabela_resultado">
								<thead class="head-table">
									<tr>
										<th>Exibir</th>
										<th>Descrição</th>
										<th>Menu Restrito</th>
										<th>Classe</th>
										<th>Imagem Menu</th>
										<th>Alterar</th>
										<th>Excluir</th>
								    </tr>
								</thead>
								<tbody>';
			
				foreach ($retorno as $row){
						
					$classe = empty($row->classe) ? "-" : $row->classe;
					$restrito = $row->menuRestrito === 'S' ? "Sim" : "Não";
						
					$html .= '<tr>
								<td><i class="fa fa-file-o icone-pesquisa" onclick="telaExibir(\''.encrypt(trim($row->idMenu)).'\');" style="cursor: pointer;"></i></td>
								<td>'.$row->descricao.'</td>
								<td>'.$restrito.'</td>
								<td>'.$classe.'</td>
								<td><i class="'.trim($row->imgMenu).'"></i></td>
								<td><i class="fa fa-edit icone-pesquisa" onclick="telaAlterar(\''.encrypt(trim($row->idMenu)).'\');" style="cursor: pointer;"></i></td>
								<td><i class="fa fa-trash-o icone-pesquisa" onclick="mostraModal(\''.encrypt(trim($row->idMenu)).'\', \''.$row->descricao.'\');" style="cursor: pointer;"></i></td>
								</tr>';
				}
			
				$html .=    '</tbody>
						  </table>';
				
				$retornoJson = true;
			
			}else{
				//Não encontrou resultados
				$retornoJson = false;
				$tipoMensagem = "alert-info";
				$mensagem = "Sua pesquisa não retornou resultado!";
			}
			
			$json = null;
			$json['sucesso'] = $retornoJson;
			$json['tipoMensagem'] = $tipoMensagem;
			$json['mensagem'] = $mensagem;
			$json['html'] = $html;
				
			echo json_encode($json);
						
		}catch (Exception $e){
			$json['sucesso'] = false;
			$json['tipoMensagem'] = "alert-danger";
			$json['mensagem'] = $e->getMessage();
			
			echo json_encode($json);
		}
	}
	
	public function telaCadastrar(){
		try {
			
			//Limpando id da sessão
			$this->session->unset_userdata('idBancoTela');
			$this->caminhoPao = $this->menu_lib->caminhoPao($this->classe, null, "Cadastrar Menu");
			
			array_push($this->js, 'plugins/iCheck/icheck', 'plugins/formValidation/formValidation', 'plugins/framework/bootstrap', 'admin/menu/cadastrar_menu');
			array_push($this->css, 'plugins/iCheck/custom', 'plugins/formValidation/formValidation');
			
			$data = null;
			$data['tipoPerfil'] = decrypt(trim($this->session->userdata('tipoPerfil')));
				
			$this->load->view('admin/menu/cadastrar_menu', $data);
	
		}catch (Exception $e){
			echo ($e->getMessage());
		}
	}
	
	public function salvar(){
		
		try {
			
			$this->layout = "";
			
			$this->util_lib->validaPermissaoRegistro("telaCadastrar", $this->classe);
			
			$retornoJson = false;
			$tipoMensagem = "";
			$mensagem = "";
				
			//Pegando dados do form
			$descricao = trim($this->input->post('descricao'));
			$classe = trim($this->input->post('classe'));
			$imgMenu = trim($this->input->post('imgMenu'));
			
			$restrito = trim($this->input->post('restrito'));
			$restrito = empty($restrito) ? "N" : $restrito;
				
			//Usuário Logado
			$idUsuario = decrypt(trim($this->session->userdata('idUsuario')));
				
			$menu = null;
			$menu['descricao'] = $descricao;
			$menu['classe'] = $classe;
			$menu['imgMenu'] = $imgMenu;
			$menu['menuRestrito'] = $restrito;
			$menu['idUsuarioCadastro'] = $idUsuario;
			$menu['dtCadastro'] = date("Y-m-d H:i:s");
			$menu['idUsuarioUltimaAlteracao'] = $idUsuario;
			$menu['dtUltimaAlteracao'] = date("Y-m-d H:i:s");
			
			//Iniciando transação
			$this->db->trans_begin();
			
			//Validar se já exite um menu com o mesmo nome
			$listaMenu = $this->menu->validarDescricaoJaCadastrada($descricao, null);
				
			if (!empty($listaMenu)){
				throw new Exception("Já existe um menu cadastrado com esse nome!");
			}
			
			if (!empty($classe)){
				//Validar se já exite uma classe com o mesmo nome
				$listaMenu = $this->menu->validarClasseJaCadastrada($classe, null);
				
				if (!empty($listaMenu)){
					throw new Exception("Já existe uma classe cadastrada com esse nome!");
				}
			}
			
			$idMenu = $this->menu->inserir($menu);
			
			if (!empty($idMenu) && $idMenu != false){
				$retornoJson = true;
				$tipoMensagem = "alert-success";
				$mensagem = "Menu cadastrado com sucesso!";
			}
			
			if ($retornoJson){
				$this->db->trans_commit();
			}else{
				$this->db->trans_rollback();
			}
			
			$json = null;
			$json['sucesso'] = $retornoJson;
			$json['tipoMensagem'] = $tipoMensagem;
			$json['mensagem'] = $mensagem;
			
			echo json_encode($json);
			
		} catch (Exception $e) {
			$this->db->trans_rollback();
			
			$json['sucesso'] = false;
			$json['tipoMensagem'] = "alert-danger";
			$json['mensagem'] = $e->getMessage();
			
			echo json_encode($json);
		}
		
	}
	
	public function telaExibir(){
		try {
			
			//Limpando id da sessão
			$this->session->unset_userdata('idBancoTela');
			$this->caminhoPao = $this->menu_lib->caminhoPao($this->classe, null, "Exibir Menu");
				
			array_push($this->js, 'plugins/iCheck/icheck', 'admin/menu/exibir_menu');
			array_push($this->css, 'plugins/iCheck/custom');
			
			$id = decrypt(trim($this->input->get("id")));
				
			$menu = $this->menu->obter($id);
			
			$data = null;
			$data['descricao'] = $menu->descricao;
			$data['classe'] = $menu->classe;
			$data['imgMenu'] = $menu->imgMenu;
			
			$html = '';
				
			if ($menu->menuRestrito === 'S'){
				$html .= '<input type="radio" value="S" id="sim" name="restrito" class="restrito-radio" checked="checked" disabled="disabled"><label for="sim">Sim</label>
						  <input type="radio" value="N" id="nao" name="restrito" class="restrito-radio" disabled="disabled"><label for="nao">Não</label>';
			}else{
				$html .= '<input type="radio" value="S" id="sim" name="restrito" class="restrito-radio" disabled="disabled"><label for="sim">Sim</label>
						  <input type="radio" value="N" id="nao" name="restrito" class="restrito-radio" checked="checked" disabled="disabled"><label for="nao">Não</label>';
			}
				
			$data['radioRestrito'] = $html;
			$data['dtCadastro'] = mostraData($menu->dtCadastro);
			$data['tipoPerfil'] = decrypt(trim($this->session->userdata('tipoPerfil')));
			
			$this->load->view('admin/menu/exibir_menu', $data);
	
		}catch (Exception $e){
			echo ($e->getMessage());
		}
	}
	
	public function telaAlterar(){
		try {
			
			$this->session->set_userdata('idBancoTela', trim($this->input->get("id")));
			$this->caminhoPao = $this->menu_lib->caminhoPao($this->classe, null, "Alterar Menu");
	
			array_push($this->js, 'plugins/iCheck/icheck', 'plugins/formValidation/formValidation', 'plugins/framework/bootstrap', 'admin/menu/alterar_menu');
			array_push($this->css, 'plugins/iCheck/custom', 'plugins/formValidation/formValidation');
			
			$id = decrypt(trim($this->input->get("id")));
			
			$menu = $this->menu->obter($id);
			
			$data = null;
			$data['descricao'] = $menu->descricao;
			$data['classe'] = $menu->classe;
			$data['imgMenu'] = $menu->imgMenu;	

			$html = '';
			
			if ($menu->menuRestrito === 'S'){
				$html .= '<input type="radio" value="S" id="sim" name="restrito" class="restrito-radio" checked="checked"><label for="sim">Sim</label>
						  <input type="radio" value="N" id="nao" name="restrito" class="restrito-radio"><label for="nao">Não</label>';
			}else{
				$html .= '<input type="radio" value="S" id="sim" name="restrito" class="restrito-radio"><label for="sim">Sim</label>
						  <input type="radio" value="N" id="nao" name="restrito" class="restrito-radio" checked="checked"><label for="nao">Não</label>';
			}
			
			$data['radioRestrito'] = $html;
			$data['tipoPerfil'] = decrypt(trim($this->session->userdata('tipoPerfil')));
			
			$this->load->view('admin/menu/alterar_menu', $data);
	
		}catch (Exception $e){
			echo ($e->getMessage());
		}
	}
	
	public function alterar(){
	
		try {
				
			$this->layout = "";
			
			$this->util_lib->validaPermissaoRegistro("telaAlterar", $this->classe);
				
			$retornoJson = false;
			$tipoMensagem = "";
			$mensagem = "";
			
			//Pegando dados do form
			$idMenu = decrypt(trim($this->session->userdata('idBancoTela')));
			$descricao = trim($this->input->post('descricao'));
			$classe = trim($this->input->post('classe'));
			$imgMenu = trim($this->input->post('imgMenu'));
			
			$restrito = trim($this->input->post('restrito'));
			$restrito = empty($restrito) ? "N" : $restrito;
			
			//Usuário Logado
			$idUsuario = decrypt(trim($this->session->userdata('idUsuario')));
				
			$menu = null;
			$menu['descricao'] = $descricao;
			$menu['classe'] = $classe;
			$menu['imgMenu'] = $imgMenu;
			$menu['menuRestrito'] = $restrito;
			$menu['idUsuarioUltimaAlteracao'] = $idUsuario;
			$menu['dtUltimaAlteracao'] = date("Y-m-d H:i:s");
			
			//Iniciando transação
			$this->db->trans_begin();
			
			//Validar se já exite um menu com o mesmo nome
			$listaMenu = $this->menu->validarDescricaoJaCadastrada($descricao, $idMenu);
			
			if (!empty($listaMenu)){
				throw new Exception("Já existe um menu cadastrado com esse nome!");
			}
				
			if (!empty($classe)){
				//Validar se já exite uma classe com o mesmo nome
				$listaMenu = $this->menu->validarClasseJaCadastrada($classe, $idMenu);
					
				if (!empty($listaMenu)){
					throw new Exception("Já existe uma classe cadastrada com esse nome!");
				}
			}
			
			//Obtendo dados do menu do banco
			$menuBanco = $this->menu->obter($idMenu);
			
			if (trim($menuBanco->menuRestrito) !== trim($restrito)){
				if ($restrito === "S"){
					$retorno = $this->menu->validaMenuIrregularesRestritos($idMenu);
					
					if (!empty($retorno)){
						
						if (sizeof($retorno) === 1){
							$this->vpm->excluir($retorno[0]->idVpmFuncionalidade);
							$this->vinculo->excluir($retorno[0]->idVinculoPerfilMenu);
						}else{
							$idVinculoPerfilMenu = null;
							
							foreach ($retorno as $key => $row){
								//Removendo o vinculo com a funcionalidade
								$this->vpm->excluir($row->idVpmFuncionalidade);
															
								if (($idVinculoPerfilMenu != null && (int)$idVinculoPerfilMenu !== (int)$row->idVinculoPerfilMenu) || sizeof($retorno) === ((int)$key + 1)){
									$this->vinculo->excluir($idVinculoPerfilMenu);
								}
								
								$idVinculoPerfilMenu = $row->idVinculoPerfilMenu;
							}
						}
					}
				}
			}
				
			if ($this->menu->alterar($menu, $idMenu)){
				$retornoJson = true;
				$tipoMensagem = "alert-success";
				$mensagem = "Menu alterado com sucesso!";
			}
				
			if ($retornoJson){
				$this->db->trans_commit();
			}else{
				$this->db->trans_rollback();
			}
				
			$json = null;
			$json['sucesso'] = $retornoJson;
			$json['tipoMensagem'] = $tipoMensagem;
			$json['mensagem'] = $mensagem;
			
			echo json_encode($json);
				
		} catch (Exception $e) {
			$this->db->trans_rollback();
			
			$json['sucesso'] = false;
			$json['tipoMensagem'] = "alert-danger";
			$json['mensagem'] = $e->getMessage();
			
			echo json_encode($json);
		}
	
	}
	
	public function excluir(){
	
		try {
	
			$this->layout = "";
			
			//Limpando id da sessão
			$this->session->unset_userdata('idBancoTela');
			
			$this->util_lib->validaPermissaoRegistro("excluir", $this->classe);
				
			$retornoJson = false;
			$tipoMensagem = "";
			$mensagem = "";
	
			//Pegando dados do form
			$id = decrypt(trim($this->input->post("idBanco")));
			
			//Iniciando transação
			$this->db->trans_begin();

			//Verificando se existe alguma vinculo do menu com o menu pai
			$menuPai = $this->vinculo->listarVinculoPorMenuPai($id);
			
			if (empty($menuPai)){
				if ($this->vpm->excluirPorIdMenu($id)){
					if ($this->vinculo->excluirPorIdMenu($id)){
						if ($this->fun->excluirPorIdMenu($id)){
							if ($this->menu->excluir($id)){
								$retornoJson = true;
								$tipoMensagem = "alert-success";
								$mensagem = "Menu excluído com sucesso!";
							}
						}
					}
				}
			}else{
				throw new Exception('Não é possível excluir o menu, pois existem outros menus abaixo dele!');
			}
	
			if ($retornoJson){
				$this->db->trans_commit();
			}else{
				$this->db->trans_rollback();
			}
	
			$json = null;
			$json['sucesso'] = $retornoJson;
			$json['tipoMensagem'] = $tipoMensagem;
			$json['mensagem'] = $mensagem;
				
			echo json_encode($json);
	
		} catch (Exception $e) {
			$this->db->trans_rollback();
			
			$json['sucesso'] = false;
			$json['tipoMensagem'] = "alert-danger";
			$json['mensagem'] = $e->getMessage();
			
			echo json_encode($json);
		}
	
	}
	
	public function validaDescricaoMenu(){
		try{
	
			$this->layout = "";
	
			$retornoJson = false;
	
			$descricao = trim($this->input->post('descricao'));
			$idMenu = decrypt(trim($this->session->userdata('idBancoTela')));
			
			$menu = $this->menu->validarDescricaoJaCadastrada($descricao, $idMenu);
	
			if (!empty($menu)){
				$retornoJson = false;
			}else{
				$retornoJson = true;
			}
	
			$json = null;
			$json['valid'] = $retornoJson;
	
			echo json_encode($json);
	
		}catch (Exception $e){
			echo ($e->getMessage());
		}
	}
	
	public function validaClasseMenu(){
		try{
	
			$this->layout = "";
	
			$retornoJson = false;
	
			$classe = trim($this->input->post('classe'));
			$idMenu = decrypt(trim($this->session->userdata('idBancoTela')));
			
			if (empty($classe)){
				$retornoJson = false;
			}else{
				$menu = $this->menu->validarClasseJaCadastrada($classe, $idMenu);
		
				if (!empty($menu)){
					$retornoJson = false;
				}else{
					$retornoJson = true;
				}
			}
				
			$json = null;
			$json['valid'] = $retornoJson;
	
			echo json_encode($json);
	
		}catch (Exception $e){
			echo ($e->getMessage());
		}
	}
	
}